home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / dev / amos / swarm.lha / swarm.AMOS / swarm.amosSourceCode < prev   
Encoding:
AMOS Source Code  |  1994-04-12  |  12.9 KB  |  568 lines

  1. '
  2. ' Swarm - Mark Baker 10/4/94 
  3. '
  4. '
  5. ' setup screen   
  6. '
  7. Global SCX,SCY,RSCX,RSCY,XH,YH
  8. SCX=635
  9. If Ntsc
  10.    SCY=200
  11. Else 
  12.    SCY=250
  13. End If 
  14. XH=120
  15. YH=42
  16. RSCX=SCX+5
  17. RSCY=SCY+5
  18. Screen Open 0,RSCX,RSCY,2,Hires
  19. Screen Display 0,XH,YH,,
  20. Flash Off : Curs Off : Hide On 
  21. Paper 0 : Pen 1 : Ink 1
  22. Palette 0,$FFF
  23. Change Mouse 4
  24. Cls 
  25. Double Buffer 
  26. Autoback 0
  27. Limit Mouse XH,YH To 320+XH,SCY+YH
  28. '
  29. ' set up variables 
  30. Global FLIES,ACC#,SPEED#,BOUNCE_ON,BOUNCE#,DRW_METHOD,SWARM_METHOD
  31. Global CHANGE_ON,CHANGE_FREQ
  32. FLIES=5
  33. ACC#=1.0
  34. SPEED#=14.0
  35. BOUNCE_ON=1
  36. BOUNCE#=1.0
  37. DRW_METHOD=1
  38. SWARM_METHOD=0
  39. CHANGE_ON=0
  40. CHANGE_FREQ=50
  41. '
  42. ' Menu 
  43. '
  44. MENU:
  45. Cls 
  46. Show On : Colour 17,$FFF
  47. Reserve Zone 15
  48. Print At(35,1)+"S W A R M"
  49. Print At(25,3)+Zone$("Number of Flies :"+Str$(FLIES),1)
  50. Print At(25,4)+Zone$("Acceleration :"+Str$(ACC#),2)
  51. Print At(25,5)+Zone$("Maximum Velocity :"+Str$(SPEED#),3)
  52. If BOUNCE_ON
  53.    Print At(25,6)+Zone$("Bouncy Walls",4)
  54.    Print At(25,7)+Zone$("Bounce factor :"+Str$(BOUNCE#),5)
  55. Else 
  56.    Print At(25,6)+Zone$("Normal Walls",4)
  57. End If 
  58. A$="Drawing Method : "
  59. If DRW_METHOD=0 Then A$=A$+"Dots"
  60. If DRW_METHOD=1 Then A$=A$+"Lines"
  61. If DRW_METHOD=2 Then A$=A$+"Polygon"
  62. Print At(25,8)+Zone$(A$,6)
  63. A$="Swarm Method : "
  64. If SWARM_METHOD=0 Then A$=A$+"all to mouse"
  65. If SWARM_METHOD=1 Then A$=A$+"to previous/mouse"
  66. If SWARM_METHOD=2 Then A$=A$+"random previous/mouse"
  67. If SWARM_METHOD=3 Then A$=A$+"all to previous"
  68. If SWARM_METHOD=4 Then A$=A$+"random targets"
  69. Print At(25,9)+Zone$(A$,7)
  70. If CHANGE_ON
  71.    Print At(25,10)+Zone$("Flies change target",8)
  72.    A$="Change Frequency : every "
  73.    A$=A$+Str$(Abs(CHANGE_FREQ))+" frames"
  74.    Print At(25,11)+Zone$(A$,9)
  75. Else 
  76.    Print At(25,10)+Zone$("Flies keep target",8)
  77. End If 
  78. Print At(5,0)+Zone$("Quit",10)
  79. Print At(25,16)+Zone$("Start",13)
  80. Print At(25,13)+Zone$("Help",11)
  81. Print At(25,14)+Zone$("About",12)
  82. Print At(19,19)+Zone$("This program is VegeWare. (c) 1994 Mark Baker.",14)
  83. Print At(23,20)+Zone$("Click on Help or About for more info.",15)
  84. '
  85. Screen Swap : Wait Vbl 
  86. Repeat : MZ=Mouse Zone : MC=Mouse Click : Until MC>0 and MZ>0
  87. '
  88. If MZ=1
  89.    _SET["Number of flies",FLIES]
  90.    FLIES=Param
  91. End If 
  92. If MZ=2
  93.    _SETF["Acceleration",ACC#]
  94.    ACC#=Param#
  95. End If 
  96. If MZ=3
  97.    _SETF["Maximum velocity",SPEED#]
  98.    SPEED#=Param#
  99. End If 
  100. If MZ=4 Then BOUNCE_ON=1-BOUNCE_ON
  101. If MZ=5
  102.    _SETF["Bounce factor",BOUNCE#]
  103.    BOUNCE#=Param#
  104. End If 
  105. If MZ=6 Then Add DRW_METHOD,1,0 To 2
  106. If MZ=7 Then Add SWARM_METHOD,1,0 To 4
  107. If MZ=8 Then CHANGE_ON=1-CHANGE_ON
  108. If MZ=9
  109.    _SET["Change frequency",CHANGE_FREQ]
  110.    CHANGE_FREQ=Param
  111. End If 
  112. If MZ=10
  113.    Fade 1
  114.    Wait 20
  115.    End 
  116. End If 
  117. If MZ=11 or MZ=15 Then HELP
  118. If MZ=12 or MZ=14 Then ABOUT
  119. If MZ=13
  120.    Fade 1 : Wait 15
  121.    Hide On 
  122.    Cls : Screen Swap : Wait Vbl 
  123.    Cls : Screen Swap : Wait Vbl 
  124.    If DRW_METHOD<2
  125.       SWARM_1
  126.    Else 
  127.       SWARM_2
  128.    End If 
  129.    Cls : Screen Swap : Wait Vbl 
  130.    Cls : Screen Swap : Wait Vbl 
  131.    Palette ,$FFF
  132. End If 
  133. Goto MENU
  134. '
  135. ' procedures 
  136. '
  137. Procedure _SET[TXT$,CUR]
  138.    Autoback 1
  139.    For N=13 To 15
  140.       Print At(25,N)+"               "
  141.    Next N
  142.    Print At(25,16)+"Press mouse buttons to change value,"
  143.    Print At(25,17)+"Press space key to accept value."
  144.    Repeat 
  145.       If Mouse Key=1 Then Inc CUR
  146.       If Mouse Key=2 Then Dec CUR
  147.       If CUR<0 Then CUR=0
  148.       Print At(25,14)+TXT$+Str$(CUR)+"   "
  149.       Wait Vbl : Wait 2
  150.    Until Inkey$=" "
  151.    Autoback 0
  152. End Proc[CUR]
  153. Procedure _SETF[TXT$,CUR#]
  154.    Autoback 1
  155.    For N=13 To 15
  156.       Print At(25,N)+"               "
  157.    Next N
  158.    Print At(25,16)+"Press mouse buttons to change value,"
  159.    Print At(25,17)+"Press space key to accept value."
  160.    T=CUR#*10
  161.    Repeat 
  162.       If Mouse Key=1 Then Inc T
  163.       If Mouse Key=2 Then Dec T
  164.       If T<0 Then T=0
  165.       Print At(25,14)+TXT$+Str$(T/10.0)+"   "
  166.       Wait Vbl : Wait 2
  167.    Until Inkey$=" "
  168.    Autoback 0
  169.    CUR#=T/10.0
  170. End Proc[CUR#]
  171. Procedure HELP
  172.    Cls 
  173.    Print At(35,1)+"H E L P"
  174.    Print At(5,3)+"To change a value, click on it or the text preceeding it."
  175.    Print At(5,4)+"This will toggle on/off values, or let you enter a value."
  176.    Print At(5,6)+"To start the SWARM click on Start."
  177.    Print At(5,8)+"To quit SWARM click on Quit."
  178.    Print At(5,10)+"For more information, click on About."
  179.    Print At(5,13)+"Click the mouse to return."
  180.    Screen Swap : Wait Vbl 
  181.    Cls 
  182.    Repeat : Until Mouse Click
  183. End Proc
  184. Procedure ABOUT
  185.    Cls 
  186.    Print At(35,1)+"A B O U T"
  187.    Print 
  188.    Print "     SWARM is a simulation of a swarm of insects (or a shoal of fish, I never"
  189.    Print "     decided which).  The easiest way to see what I mean is to try it. Click"
  190.    Print "     the mouse once now, then click on Start to see what happens. Just click "
  191.    Print "     the mouse again to stop."
  192.    Print 
  193.    Print "     You can set the acceleration, maximum velocity, etc.. from the main "
  194.    Print "     screen.  Just click on the value you want to change."
  195.    Print 
  196.    Print "     If you have a faster amiga (A1200, A4000) then try >30 flies. Poor saps "
  197.    Print "     like myself with A500s should stick to about 15 for smooth movement."
  198.    Print 
  199.    Print "     SWARM is VegeWare, which means if you like it then please send me a "
  200.    Print "     vegetarian recepie - I'm bored of vegieburgers!  Feel free to send me "
  201.    Print "     anything... especially suggestions or your own programs. This program "
  202.    Print "     must not be distributed for profit, and that includes Coverdisks - get in"
  203.    Print "     touch with me if you want to use it on a coverdisk."
  204.    Print "     It may be included in collections such as Fred Fish's excellent "
  205.    Print "     contribution to the amiga communty. (Thanks Fred!)"
  206.    Screen Swap : Wait Vbl 
  207.    Repeat : Until Mouse Click
  208.    Cls 
  209.    Print At(35,1)+"A B O U T"
  210.    Print 
  211.    Print "     Here is my address: "
  212.    Print 
  213.    Print "     Mark Baker"
  214.    Print "     51 Ladbroke Road"
  215.    Print "     Redhill"
  216.    Print "     Surrey"
  217.    Print "     RH1 1JU"
  218.    Print "     England"
  219.    Print 
  220.    Print "     Until August, my email address is: "
  221.    Print 
  222.    Print "     ukrbake@prl.philips.co.uk"
  223.    Screen Swap : Wait Vbl 
  224.    Repeat : Until Mouse Click
  225.    Cls 
  226. End Proc
  227. Procedure SWARM_2
  228.    Dec FLIES
  229.    TX=0
  230.    TY=0
  231.    SCALE=2^15
  232.    ACCEL=SCALE*ACC#
  233.    MX2=SPEED#*SCALE
  234.    MX1=-MX2
  235.    MY2=MX2/2
  236.    MY1=-MY2
  237.    X Mouse=XH+(SCX/4)
  238.    Y Mouse=YH+(SCY/2)
  239.    If CHANGE_ON
  240.       CHANGE=CHANGE_FREQ
  241.    Else 
  242.       CHANGE=0
  243.    End If 
  244.    '
  245.    LPCOUNT=0
  246.    Dim VX(FLIES),VY(FLIES)
  247.    Dim AX(FLIES),AY(FLIES)
  248.    Dim TARG(FLIES)
  249.    For N=0 To FLIES
  250.       AX(N)=Rnd(SCX)
  251.       AY(N)=Rnd(SCY)
  252.    Next N
  253.    If SWARM_METHOD=0
  254.       For N=0 To FLIES
  255.          TARG(N)=-1
  256.       Next N
  257.    End If 
  258.    If SWARM_METHOD=1
  259.       For N=0 To FLIES
  260.          TARG(N)=N-1
  261.       Next N
  262.    End If 
  263.    If SWARM_METHOD=2
  264.       TARG(0)=-1
  265.       For N=1 To FLIES
  266.          MX=N-1
  267.          If MX=0
  268.             TARG(N)=0
  269.          Else 
  270.             TARG(N)=Rnd(N-1)
  271.          End If 
  272.          If Rnd(2)=0
  273.             TARG(N)=-1
  274.          End If 
  275.       Next N
  276.    End If 
  277.    If SWARM_METHOD=3
  278.       For N=1 To FLIES
  279.          TARG(N)=N-1
  280.       Next N
  281.       TARG(0)=FLIES
  282.    End If 
  283.    If SWARM_METHOD=4
  284.       For N=0 To FLIES
  285.          Repeat 
  286.             TARG(N)=Rnd(FLIES)
  287.          Until TARG(N)<>N
  288.       Next N
  289.    End If 
  290.    '
  291.    Do 
  292.       For N=0 To FLIES
  293.          TVX=VX(N)
  294.          TVY=VY(N)
  295.          If TARG(N)=-1
  296.             TTX=TX
  297.             TTY=TY
  298.          Else 
  299.             TTX=AX(TARG(N))
  300.             TTY=AY(TARG(N))
  301.          End If 
  302.          Add TTX,-AX(N)
  303.          CX=TTX*TTX
  304.          Add TTY,-AY(N)
  305.          CY=TTY*TTY
  306.          T=CX
  307.          Add T,CY
  308.          If T=0
  309.             CD=0
  310.          Else 
  311.             CD=ACCEL/T
  312.             If CD=0
  313.                CD=1
  314.             End If 
  315.          End If 
  316.          '
  317.          T=CD*CX
  318.          If TTX>0
  319.             Add TVX,T
  320.          Else 
  321.             Add TVX,-T
  322.          End If 
  323.          '
  324.          T=CD*CY
  325.          If TTY>0
  326.             Add TVY,T
  327.          Else 
  328.             Add TVY,-T
  329.          End If 
  330.          ' maximum velociy check
  331.          If TVX>MX2 Then TVX=MX2 Else If TVX<MX1 Then TVX=MX1
  332.          If TVY>MY2 Then TVY=MY2 Else If TVY<MY1 Then TVY=MY1
  333.          '
  334.          Add AX(N),TVX/SCALE
  335.          Add AY(N),TVY/SCALE
  336.          VX(N)=TVX
  337.          VY(N)=TVY
  338.          ' screen walls...
  339.          If AX(N)>SCX
  340.             AX(N)=SCX
  341.             If BOUNCE_ON : VX(N)=-BOUNCE#*Abs(VX(N)) : End If 
  342.          Else 
  343.             If AX(N)<0
  344.                AX(N)=0
  345.                If BOUNCE_ON : VX(N)=BOUNCE#*Abs(VX(N)) : End If 
  346.             End If 
  347.          End If 
  348.          If AY(N)>SCY
  349.             AY(N)=SCY
  350.             If BOUNCE_ON : VY(N)=-BOUNCE#*Abs(VY(N)) : End If 
  351.          Else 
  352.             If AY(N)<0
  353.                AY(N)=0
  354.                If BOUNCE_ON : VY(N)=BOUNCE#*Abs(VY(N)) : End If 
  355.             End If 
  356.          End If 
  357.       Next N
  358.       TX=X Screen(X Mouse)
  359.       TY=Y Screen(Y Mouse)
  360.       Ink 0 : Bar 0,0 To RSCX,RSCY
  361.       Ink 1 : Plot TX,TY
  362.       Gr Locate AX(1),AY(1)
  363.       For N=1 To FLIES
  364.          Draw To AX(N),AY(N)
  365.       Next N
  366.       Screen Swap : Wait Vbl 
  367.       '
  368.       If Mouse Click Then Goto _END2
  369.       If Timer>80
  370.          C=6+Rnd(9)+16*(6+Rnd(9))+256*(6+Rnd(9))
  371.          Fade 3,,C
  372.          Timer=0
  373.       End If 
  374.       If CHANGE_ON
  375.          If LPCOUNT>CHANGE
  376.             LPCOUNT=0
  377.             N=Rnd(FLIES)
  378.             Repeat 
  379.                T=Rnd(FLIES+1)-1
  380.             Until N<>T
  381.             TARG(N)=T
  382.          End If 
  383.          Inc LPCOUNT
  384.       End If 
  385.    Loop 
  386.    '
  387.    _END2:
  388.    Fade 1
  389.    Wait 20
  390.    Inc FLIES
  391.    '
  392. End Proc
  393. Procedure SWARM_1
  394.    Dec FLIES
  395.    TX=0
  396.    TY=0
  397.    SCALE=2^15
  398.    ACCEL=SCALE*ACC#
  399.    MX2=SPEED#*SCALE
  400.    MX1=-MX2
  401.    MY2=MX2/2
  402.    MY1=-MY2
  403.    X Mouse=XH+(SCX/4)
  404.    Y Mouse=YH+(SCY/2)
  405.    If CHANGE_ON
  406.       CHANGE=CHANGE_FREQ
  407.    Else 
  408.       CHANGE=0
  409.    End If 
  410.    '
  411.    LPCOUNT=0
  412.    Dim VX(FLIES),VY(FLIES)
  413.    Dim AX(FLIES),AY(FLIES)
  414.    Dim TARG(FLIES)
  415.    Dim OX(FLIES),OY(FLIES)
  416.    For N=0 To FLIES
  417.       AX(N)=Rnd(SCX)
  418.       AY(N)=Rnd(SCY)
  419.       OX(N)=AX(N)
  420.       OY(N)=AY(N)
  421.    Next N
  422.    If SWARM_METHOD=0
  423.       For N=0 To FLIES
  424.          TARG(N)=-1
  425.       Next N
  426.    End If 
  427.    If SWARM_METHOD=1
  428.       For N=0 To FLIES
  429.          TARG(N)=N-1
  430.       Next N
  431.    End If 
  432.    If SWARM_METHOD=2
  433.       TARG(0)=-1
  434.       For N=1 To FLIES
  435.          MX=N-1
  436.          If MX=0
  437.             TARG(N)=0
  438.          Else 
  439.             TARG(N)=Rnd(MX)
  440.          End If 
  441.          If Rnd(2)=0
  442.             TARG(N)=-1
  443.          End If 
  444.       Next N
  445.    End If 
  446.    If SWARM_METHOD=3
  447.       For N=1 To FLIES
  448.          TARG(N)=N-1
  449.       Next N
  450.       TARG(0)=FLIES
  451.    End If 
  452.    If SWARM_METHOD=4
  453.       For N=0 To FLIES
  454.          Repeat 
  455.             TARG(N)=Rnd(FLIES)
  456.          Until TARG(N)<>N
  457.       Next N
  458.    End If 
  459.    '
  460.    Do 
  461.       For N=0 To FLIES
  462.          TVX=VX(N)
  463.          TVY=VY(N)
  464.          If TARG(N)<0
  465.             TTX=TX
  466.             TTY=TY
  467.          Else 
  468.             TTX=AX(TARG(N))
  469.             TTY=AY(TARG(N))
  470.          End If 
  471.          Add TTX,-AX(N)
  472.          CX=TTX*TTX
  473.          Add TTY,-AY(N)
  474.          CY=TTY*TTY
  475.          T=CX
  476.          Add T,CY
  477.          If T=0
  478.             CD=0
  479.          Else 
  480.             CD=ACCEL/T
  481.             If CD=0
  482.                CD=1
  483.             End If 
  484.          End If 
  485.          '
  486.          T=CD*CX
  487.          If TTX>0
  488.             Add TVX,T
  489.          Else 
  490.             Add TVX,-T
  491.          End If 
  492.          '
  493.          T=CD*CY
  494.          If TTY>0
  495.             Add TVY,T
  496.          Else 
  497.             Add TVY,-T
  498.          End If 
  499.          ' maximum velociy check
  500.          If TVX>MX2 Then TVX=MX2 Else If TVX<MX1 Then TVX=MX1
  501.          If TVY>MY2 Then TVY=MY2 Else If TVY<MY1 Then TVY=MY1
  502.          '
  503.          Add AX(N),TVX/SCALE
  504.          Add AY(N),TVY/SCALE
  505.          VX(N)=TVX
  506.          VY(N)=TVY
  507.          ' screen walls...
  508.          If AX(N)>SCX
  509.             AX(N)=SCX
  510.             If BOUNCE_ON : VX(N)=-BOUNCE#*Abs(VX(N)) : End If 
  511.          Else 
  512.             If AX(N)<0
  513.                AX(N)=0
  514.                If BOUNCE_ON : VX(N)=BOUNCE#*Abs(VX(N)) : End If 
  515.             End If 
  516.          End If 
  517.          If AY(N)>SCY
  518.             AY(N)=SCY
  519.             If BOUNCE_ON : VY(N)=-BOUNCE#*Abs(VY(N)) : End If 
  520.          Else 
  521.             If AY(N)<0
  522.                AY(N)=0
  523.                If BOUNCE_ON : VY(N)=BOUNCE#*Abs(VY(N)) : End If 
  524.             End If 
  525.          End If 
  526.       Next N
  527.       TX=X Screen(X Mouse)
  528.       TY=Y Screen(Y Mouse)
  529.       Ink 0 : Bar 0,0 To RSCX,RSCY
  530.       Ink 1 : Plot TX,TY
  531.       If DRW_METHOD=0
  532.          For N=0 To FLIES
  533.             Plot AX(N),AY(N)
  534.          Next N
  535.       Else 
  536.          For N=0 To FLIES
  537.             Draw OX(N),OY(N) To AX(N),AY(N)
  538.             OX(N)=AX(N)
  539.             OY(N)=AY(N)
  540.          Next N
  541.       End If 
  542.       Screen Swap : Wait Vbl 
  543.       '
  544.       If Mouse Click Then Goto _END1
  545.       If Timer>80
  546.          C=6+Rnd(9)+16*(6+Rnd(9))+256*(6+Rnd(9))
  547.          Fade 3,,C
  548.          Timer=0
  549.       End If 
  550.       If CHANGE_ON
  551.          If LPCOUNT>CHANGE
  552.             LPCOUNT=0
  553.             N=Rnd(FLIES)
  554.             Repeat 
  555.                T=Rnd((FLIES+1))-1
  556.             Until N<>T
  557.             TARG(N)=T
  558.          End If 
  559.          Inc LPCOUNT
  560.       End If 
  561.    Loop 
  562.    '
  563.    _END1:
  564.    Fade 1
  565.    Wait 20
  566.    Inc FLIES
  567.    '
  568. End Proc